package lockDemo.semaphore;
import java.util.concurrent.Semaphore;
/**
 * @author Ajie
 * @date 2023/8/8
 * @function
 *
 * Java Semaphore
 *
 * 不可重入
 * 通常比synchronized更高效，尤其在高并发场景下
 * Semaphore (基于AQS):
 * 基础机制	CAS & 队列
 * acquire(), release(), tryAcquire()
 *
 * 1. 详细解释:
 * Semaphore（信号量）是Java并发工具包java.util.concurrent中的一个类。它是一个计数信号量，用于控制同时访问某个特定资源的线程数量。简单地说，它可以限制同时访问资源的线程数。
 *
 * 2. 什么意思:
 * Semaphore维护了一个许可集合。为了访问受限的资源，线程必须首先从信号量获取许可。当许可用尽时，其他所有试图获取许可的线程都会被阻塞，直到有线程释放一个或多个许可。
 *
 * 3. 有什么作用:
 *
 * 限制资源的并发访问：例如，当你有一个资源池（如数据库连接池）并且你想限制同时使用这些资源的线程数。
 * 作为互斥锁：当信号量只有一个许可时，它可以作为一个互斥锁。
 *
 */
public class SemaphoreDemo_01 {
        private static final Semaphore SEMAPHORE = new Semaphore(3); // 3个许可

        public static void main(String[] args) {
            for (int i = 0; i < 10; i++) {
                new Thread(new Task()).start();
            }
        }

        static class Task implements Runnable {
            @Override
            public void run() {
                try {
                    SEMAPHORE.acquire(); // 获取许可
                    System.out.println(Thread.currentThread().getName() + " acquired the semaphore.");
                    Thread.sleep(2000); // 模拟任务
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    System.out.println(Thread.currentThread().getName() + " releasing the semaphore.");
                    SEMAPHORE.release(); // 释放许可
                }
            }
        }
    }
